package sliceformUtils;

import pluginUtils.Plane;
import pluginUtils.Pos3D;

// Un triangle, c'est trois sommets
public class Triangle extends Encombrant implements Rotable<Triangle> {
	protected Pos3D S1,S2,S3; 
	

	
	public Triangle(Pos3D a,Pos3D b,Pos3D c){
		S1=a;
		S2=b;
		S3=c; 
		
		if(S1.getX()<minX)minX=S1.getX(); 
		if(S2.getX()<minX)minX=S2.getX(); 
		if(S3.getX()<minX)minX=S3.getX(); 
		
		if(S1.getX()>maxX)maxX=S1.getX(); 
		if(S2.getX()>maxX)maxX=S2.getX(); 
		if(S3.getX()>maxX)maxX=S3.getX(); 
		
		if(S1.getY()<minY)minY=S1.getY(); 
		if(S2.getY()<minY)minY=S2.getY(); 
		if(S3.getY()<minY)minY=S3.getY(); 
		
		if(S1.getY()>maxY)maxY=S1.getY(); 
		if(S2.getY()>maxY)maxY=S2.getY(); 
		if(S3.getY()>maxY)maxY=S3.getY(); 
		
		
		if(S1.getZ()<minZ)minZ=S1.getZ(); 
		if(S2.getZ()<minZ)minZ=S2.getZ(); 
		if(S3.getZ()<minZ)minZ=S3.getZ(); 
		
		if(S1.getZ()>maxZ)maxZ=S1.getZ(); 
		if(S2.getZ()>maxZ)maxZ=S2.getZ(); 
		if(S3.getZ()>maxZ)maxZ=S3.getZ(); 
		
		xwide=maxX-minX;
		ywide=maxY-minY;
		zwide=maxZ-minZ;
		
	}

	
	/** 
	 * Pour savoir si un triangle est coupe par un plan
	 * TODO : probleme quand un point est dans le plan
	 *  **/
	
	public boolean isCut(Plane p){
		double distS1=p.relative(S1); 
		double distS2=p.relative(S2); 
		double distS3=p.relative(S3); 
		if((distS1<0)&&(distS2>0)) return true; 
		if((distS2<0)&&(distS1>0)) return true; 
		if((distS1<0)&&(distS3>0)) return true; 
		if((distS3<0)&&(distS1>0)) return true; 
		if((distS2<0)&&(distS3>0)) return true; 
		if((distS3<0)&&(distS2>0)) return true;
		return false; 
		
	}
	
	private static int signe(double a){
		if(a==0) return 0; 
		if(a<0) return -1; 
		return 1;
	}
	
	/** 
	 * Calcule le segment intersection du plan et du triangle
	 * @param p : le plan
	 * @return les extremites du segment
	 */
	public Segment coupePar(Plane p){
		double distS1=p.relative(S1); 
		double distS2=p.relative(S2); 
		double distS3=p.relative(S3);
		int signe1=signe(distS1);
		int signe2=signe(distS2);
		int signe3=signe(distS3);
		Pos3D a=null,b=null; 
		if((signe1!=signe2)&&(signe1!=signe3)) {a=p.pointInter(S1, S2);b=p.pointInter(S1, S3);  } ;
		if((signe2!=signe1)&&(signe2!=signe3)) {a=p.pointInter(S1, S2);b=p.pointInter(S2, S3);  }; 
		if((signe3!=signe1)&&(signe3!=signe2)) {a=p.pointInter(S1, S3);b=p.pointInter(S2, S3);  }; 
		return new Segment(new Pos3D(a),new Pos3D(b));
	}
	
	public String toString(){
		String s="Triangle \n"; 
		s+=S1+"\n"+S2+"\n"+S3; 
		return s; 
	}
	
	
	public Triangle rotate(CoupleDAngles rot){
		Triangle resu=new Triangle(S1.rotate(rot),S2.rotate(rot),S3.rotate(rot)); 
		return resu; 
	}
	
	public Triangle rotateInverse(CoupleDAngles rot){
		Triangle resu=new Triangle(S1.rotateInverse(rot),S2.rotateInverse(rot),S3.rotateInverse(rot)); 
		return resu; 
	}
	
}
